/*
   枚举处理+dp。
   先用2进制枚举那些组合能够被两辆车一次载完。
   保留合法状态，然后根据合法状态dp

   看了wy大大的思路...

   用vector存状态tle了一次...
   程序没有写好。

*/


#include<iostream>
#include<string>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<set>
#include<map>
using namespace std;

int vs[2000],vsn;
int n,C1,C2,c[100],cc[100];

void getstatu(){
	int i,j,k;
	//vs.clear();
	int size=1<<n;
	vsn=0;
	for( i=0;i<size;i++){
		int bitn=0;  

		for( k=i,j=0;j<n;j++){
			if( k&1 ){
				//cc.push_back(c[j]);
				cc[bitn++]=c[j];
			}
			k>>=1;
		}

		//check whether match
		bool ok=false;//
		int M=1<<bitn;//暴力枚举
		for( j=0;j<M;j++){
			int tc1=C1,tc2=C2;
			int tmp=j;
			for( int p=0;p<bitn;p++){
				if( tmp&1 )tc1-=cc[p];
				else tc2-=cc[p];
				tmp>>=1;
				if ( tc1 <0 || tc2<0 )break;
			}
			if( tc1>=0 && tc2>=0 ){
				ok=true;break;
			}
		}

		//propre statu
		if( ok )//vs.push_back(i);
		vs[ vsn++ ]=i;
	}
}

int d[2000];
int dp(){
	int i,j,k;
	memset(d,-1,sizeof(d));
	d[0]=0;
	int _max=0,nn=vsn;
	for(i=0;i<vsn;i++){
		for( j=_max;j>=0;j--)
			if( d[j]!=-1 ){
				int t=vs[i]+j;
				if( t != (vs[i]|j) )continue;//状态不能连接
				if( t > _max )_max =t;
				if( d[t]==-1 || d[t] > d[j]+1 )
					d[t]=d[j]+1;
			}
	}

	return d[(1<<n)-1];
}

int main(){
	int i,j,k,T,ca;
	scanf("%d",&T);
	for(ca=1;ca<=T;ca++){
		scanf("%d%d%d",&n,&C1,&C2);
		for(i=0;i<n;i++)scanf("%d",&c[i]);
		sort(c,c+n);
		getstatu();//计算合法状态
		printf("Scenario #%d:\n%d\n\n",ca,dp());

	}
	return 0;
}
